package ar.edu.utn.frba.dds.aterrizar.aerolineas;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import com.lanchita.excepciones.CodigoErroneoException;

import ar.edu.utn.frba.dds.aterrizar.busquedas.Vuelo;
import ar.edu.utn.frba.dds.aterrizar.criterioDeOrden.CriterioDeOrden;
import ar.edu.utn.frba.dds.aterrizar.domain.fechas.ComparadorDeFechas;
import ar.edu.utn.frba.dds.aterrizar.domain.fechas.ConversorDeFormato;
import ar.edu.utn.frba.dds.aterrizar.domain.fechas.Latinoamericano;

public class OperadorDeAerolineas {
	
	private static final OperadorDeAerolineas INSTANCE = new OperadorDeAerolineas();
	private static ArrayList<AerolineasInterface> aerolineas;

	public static void createInstance() {
		aerolineas = new ArrayList<AerolineasInterface>();
	}
	
	public static OperadorDeAerolineas getInstance() {
		return INSTANCE;
	}
	
	public static ArrayList<AerolineasInterface> getAerolineas() {
		return aerolineas;
	}
	
	public Vuelo encontrarVueloPorCodigo(String codigoDeVueloBuscado, String codigoDeAsientoBuscado) {
		for(AerolineasInterface aerolinea : getAerolineas()) {
			try {
				return aerolinea.encontrarVueloPorCodigo(codigoDeVueloBuscado, codigoDeAsientoBuscado);
			} catch(CodigoErroneoException e) {
				//NADA
			}
		}
		throw new CodigoErroneoException(codigoDeVueloBuscado + "-" + codigoDeAsientoBuscado);
	}
	
	public void ordenar(List<Vuelo> vuelos, CriterioDeOrden criterio) {
		Collections.sort(vuelos, criterio);
	}

	public int getDuracionDeVueloEnMinutos(Vuelo vuelo) {
		ConversorDeFormato conversor = new ConversorDeFormato();
		conversor.agregarFormato(new Latinoamericano());
		Date fechaPartida = conversor.convertirFecha(vuelo.getFechaSalida());
		Date fechaLlegada = conversor.convertirFecha(vuelo.getFechaLlegada());
		ComparadorDeFechas comparador = new ComparadorDeFechas();
		int cantidadDeDias = comparador.diferenciaEntre(fechaPartida, fechaLlegada);
		return comparador.diferenciaEntreHorasEnMinutos(vuelo.getHorarioSalida(), vuelo.getHorarioLlegada(), cantidadDeDias);
	}

	public String expresarMinutosEnStringHora(int minutosAConvertir) {
		ConversorDeFormato conversor = new ConversorDeFormato();
		return conversor.convertirMinutosEnStringHora(minutosAConvertir);
	}

	public void agregarAerolinea(AerolineasInterface nuevaAerolinea) {
		getAerolineas().add(nuevaAerolinea);
		
	}

	public Set<String> getOrigenes() {
		Set<String> origenes = new HashSet<String>();
		for(AerolineasInterface aerolinea : getAerolineas()) {
			for(Vuelo vuelo : aerolinea.getAsientosTotales()) {
				origenes.add(vuelo.getAeroOrigen());
			}
		}
		return origenes;
	}

	public Set<String> getDestinos() {
		Set<String> destinos = new HashSet<String>();
		for(AerolineasInterface aerolinea : getAerolineas()) {
			for(Vuelo vuelo : aerolinea.getAsientosTotales()) {
				destinos.add(vuelo.getAeroDestino());
			}
		}
		return destinos;
	}
	
	public ArrayList<Vuelo> getTodosLosVuelos() {
		ArrayList<Vuelo> vuelos = new ArrayList<Vuelo>();
		for(AerolineasInterface aerolinea : aerolineas) {
			vuelos.addAll(aerolinea.getAsientosTotales());
		}
		return vuelos;
	}
	
}
